#使用_开头的属性，实际上依然可以在外部访问，所以这种方式我们一般不用
#一般情况下我们会将一些私有属性（不希望被外部访问的属性）以_开头
#一般情况下，使用_开头的属性都是私有属性，没有特殊需要不要修改私有属性
class Person:
    def __init__(self,name):
        self._name=name

    #property装饰器，用来将一个get方法转换为对象的属性
    #添加为property装饰器以后，我们就可以像调用属性一样调用方法
    @property
    def name(self):
        print("get方法执行了")
        return self._name

    #setter方法的装饰器:＠属性名.setter
    @name.setter
    def set_name(self,name):
        print('setter方法调用了')
        self._name=name


p=Person('孙悟空')
#这种方式依然可以查看到p的_name属性，只不过写代码的人加了_后，表示该属性不希望被修改
#print(p._name)

#这行会报错，因为这个时候name已经变成了属性，而不是方法,此时p.name＝孙悟空，孙悟空()会直接报错，TypeError: 'str' object is not callable
#print(p.name())

#正确写法
#print(p.name)

#给name重新赋值，调用name的setter方法
p.set_name="猪八戒"
print(p.name)